package org.wisteria.framework.web;

import lombok.Data;

import java.io.Serializable;

/**
 * 调用接口的执行结果类
 * @author Lei.Liu
 *
 * @param <T>	输出数据的类型
 */
@Data
public class APIResult<T> implements Serializable {
	private static final long serialVersionUID = -8792785262618671597L;

	public APIResult() {}

	public APIResult(String code) {
		this(code, null, null);
	}

	public APIResult(String code, T data) {
		this(code,null, data);
	}
	
	public APIResult(String code, String message) {
		this(code, message, null);
	}
	
	public APIResult(String code, String message, T data) {
		this.code = code;
		this.message = message;
		this.data = data;

		if (statusCode.success.name().equals(code)) {
			this.success = true;
		}
	}
	
	/**
	 * 创建成功的执行结果
	 * @return	返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> success() {
		return success(null);
	}
	
	/**
	 * 创建成功的执行结果，并输出数据
	 * @param data	输出的数据
	 * @return		返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> success(T data) {
		return new APIResult<T>(statusCode.success.name(), data);
	}

	public static <T> APIResult<T> successWithMessage(String message) {
		return new APIResult<T>(statusCode.success.name(), message);
	}
	
	/**
	 * 创建失败的执行结构，并输出消息
	 * @param message	输出的消息
	 * @return			返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> fail(String message) {
		return fail(statusCode.fail.name(), message);
	}

	/**
	 * 创建失败的执行结构，并输出消息
	 * @param message	输出的消息
	 * @return			返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> fail(String code, String message) {
		return new APIResult<T>(code, message);
	}

	/**
	 * 创建登录失效执行结构
	 * @return			返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> logout() {
		return new APIResult<T>(statusCode.logout.name());
	}

	/**
	 * 创建无权限执行结构
	 * @return			返回接口调用的执行结果类
	 */
	public static <T> APIResult<T> noPermission() {
		return new APIResult<T>(statusCode.noPermission.name());
	}

	/**
	 * 状态码
	 */
	public enum statusCode {
		/**
		 * 表示成功
		 */
		success,

		/**
		 * 表示失败
		 */
		fail,

		/**
		 * 表示登录会话实现
		 */
		logout,

		/**
		 * 无权限
		 */
		noPermission
	}

	private Boolean success = false;
	
	/**
	 * 接口执行结果输出的消息的代码
	 *
	 */
	private String code;
	
	/**
	 * 接口执行结果输出的消息的文本
	 */
	private String message;
	
	/**
	 * 接口执行结果输出的数据
	 */
	private T data;
}
